/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package PurchaseGUIs;

import CustomerGUIs.NewCustomerForm;
import ExternalModel.CreditCardAuthority;
import Model.CreditCard;
import Model.CreditCardLog;
import Model.Customer;
import Model.ExternalDBManager;
import Model.InternalDBManager;
import Supermarket.AppMessages;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.swing.JDialog;
import javax.swing.JOptionPane;


/**
 *
 * @author Manolis
 */
public class CheckCustomerCard {
    
    private static EntityManager em = InternalDBManager.getEm();
    private static EntityManager exm = ExternalDBManager.getEm();
    private JDialog parent;
    private Customer customer;
    private CreditCard creditCard;
    //κλάση ημερολόγιο συναλλαγής
    private CreditCardLog creditCardLog;
    private CreditCardAuthority creditCardAuthority;
    private boolean completed = false;
    
    //μια κλάση ελέγχου πιστωτικής κάρτας
    public CheckCustomerCard(JDialog p, Customer c){
        this.parent = p;
        //δημιούργησε ένα κενό ημερολόγιο συναλλαγής
        this.creditCardLog = new CreditCardLog();
        if (!em.getTransaction().isActive()){
           em.getTransaction().begin();
        }
        //βάλε τον πελάτη στο context
        this.customer = em.merge(c);
        //αν ο πελάτης δεν έχει κάρτα 
        if(customer.getCreditCardList().isEmpty()){
            //δημιουργία μιας νέας για εισαγωγή στοιχείων
            creditCard = new CreditCard();
        }else{ 
            //αλλιώς διάβασε την πιστωτική του πελάτη
            creditCard = customer.getCreditCardList().iterator().next();
        }
        //έλεγξε την κάρτα του πελάτη
        checkCardValidity();
    }

    private void checkCardValidity() {
        //3 το πολύ προσπάθειες 
        while (creditCardLog.getNumberOfAttempts() < 3 && !creditCardLog.getSuccess()){ 
            
            //εμφάνισε φόρμα εισαγωγής πιστωτικής κάρτας
            NewCustomerForm checkCreditCard = new NewCustomerForm(parent, true, customer, creditCard);
            checkCreditCard.setVisible(true);
            //όταν κλείσει διάβασε την κάρτα
            this.creditCard = checkCreditCard.getCreditCard();
            //ανίχνευση ακύρωσης συναλλαγής από τον χρήστη
            completed = checkCreditCard.getStatusUpdate();
            checkCreditCard.dispose();
            //αν ο έλεγχος ακυρώθηκε από τον χρήστη 
            //δεν γίνονται άλλες προσπάθειες
            if (!completed) break;
            
            //αύξησε τον αύξοντα αριθμό της προασπάθειας
            creditCardLog.increaseNumberOfAttempts();
            //κατέγραψε την ημερομηνία
            creditCardLog.setAttempt();
            
            if (!exm.getTransaction().isActive()){
                exm.  getTransaction().begin();
            }
            
            //ψάξε στην εξωτερική βάση για την κάρτα 
            try{
                creditCardAuthority = (CreditCardAuthority) exm.createNamedQuery("CreditCardAuthority.Match")
                    .setParameter("number", creditCard.getPkNumber())
                    .setParameter("cvv", creditCard.getCvv())
                    .setParameter("ownerName", creditCard.getOwnerName())
                    .getSingleResult();
                if(creditCardAuthority.getBank().toString().equals(creditCard.getBank().toString())){
                    AppMessages.CreditCardSuccessMessage(parent);
                    //κατέγραψε το αποτέλεσμα
                    creditCardLog.setSuccess(true); 
                }else{
                    //αν δεν ταιριάζει η τράπεζα δώσε μήνυμα
                    AppMessages.CreditCardNotFoundMessage(parent);
                }
            }catch (NoResultException e){
                //αν δεν βρεθεί η κάρτα δώσε μήνυμα
                AppMessages.CreditCardNotFoundMessage(parent);
                //κατέγραψε το αποτέλεσμα
                creditCardLog.setSuccess(false);
            }
        } 
        //αν δεν έχει πετύχει η συναλλαγή
        if (!creditCardLog.getSuccess()){
            //αν έχει ακυρωθεί από τον χρήστη μήνυμα
            if (!completed)
                AppMessages.CustomerCanceledMessage(parent);
            else
                //αν δεν έχει βρεθεί δώσε αντίστοιχο μήνυμα
                AppMessages.purchaseCanceledMessage(parent);
        }
        //Αν δεν έχει γίνει ακύρωση από τον χρήστη, προβολή του ημερολογίου συναλλαγής
        if (completed)
                JOptionPane.showMessageDialog(parent, "Προσπάθειες: " 
                        + creditCardLog.getNumberOfAttempts()
                        + " - Αποτέλεσμα: " + (creditCardLog.getSuccess()? "Έγκριση" : "Απόρριψη")  
                        + " - Ημερομηνία: " + creditCardLog.getAttemptsList().
                                get(creditCardLog.getAttemptsList().size()-1).toLocaleString(),
                        "ΠΛηροφορίες συναλλαγής", JOptionPane.INFORMATION_MESSAGE);
    }
   
    
    //επιστρέφει το ημερολόγιο συναλλαγής
    public CreditCardLog getCreditCardLog(){
        return this.creditCardLog;
    }
    
}
